package sistema;

import java.io.BufferedReader;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.util.Calendar;
import java.util.HashMap;

public class ContadorDeOcorrencia {
	private static HashMap<Integer, Integer> ocorrencias;
	private static BufferedReader entrada;
	private static FileOutputStream saida;
	private static int quantidadeDeNumeros, tempoInicial, tempoTotal;
	
	public static void main(String[] args) {
        try {
        	tempoInicial = Calendar.getInstance().get(Calendar.SECOND);
        	ocorrencias = new HashMap<Integer, Integer>();
        	entrada = new BufferedReader(new FileReader(args[0]));
        	iniciaMapaDeOcorrencias(args[1]);
        	saida = new FileOutputStream(args[1]);
        	contaOcorrencias();
        	gravaOcorrencias();
        	tempoTotal = Calendar.getInstance().get(Calendar.SECOND) - tempoInicial;
			saida.write(("Informacoes: " + quantidadeDeNumeros + " numeros contados em " + tempoTotal + " segundos.").getBytes());
            entrada.close();
            saida.close();
        } catch(Exception ex) {
            System.err.print(ex.getMessage());
        }
	}
	
	private static void iniciaMapaDeOcorrencias(String arquivo) throws Exception {
		BufferedReader saidaAnterior = new BufferedReader(new FileReader(arquivo));
		String string;
	    while ((string = saidaAnterior.readLine()) != null) {
	    	if (!string.equals("Numero - Ocorrencia") && !string.contains("Informacoes") && !string.isEmpty()) {
	    		String[] linha = string.split(" - ");
	    		ocorrencias.put(Integer.parseInt(linha[0]), Integer.parseInt(linha[1]));
	    	}
	    } 
	    saidaAnterior.close();
	}
	
    private static void contaOcorrencias() throws Exception {
	    String string;
	    while ((string = entrada.readLine()) != null) {
	    	if (!string.contains("Informacoes") && !string.isEmpty()) {
	    		if (ocorrencias.containsKey(Integer.parseInt(string))) {
	    			ocorrencias.put(Integer.parseInt(string), ocorrencias.get(Integer.parseInt(string))+1);
	    		} else {
	    			ocorrencias.put(Integer.parseInt(string), 1);
	    		}
	    		quantidadeDeNumeros++;
	    	}
	    }
    }
    
    private static void gravaOcorrencias() throws Exception {
    	saida.write(("Numero - Ocorrencia" + System.getProperty("line.separator")).getBytes());
        for (Integer numero: ocorrencias.keySet()) {
        	saida.write((numero + " - " + ocorrencias.get(numero) + System.getProperty("line.separator")).getBytes());
        }
    }
}